/******************************************************************************* * Code contributed to the webinos project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Copyright 2013 Sony Mobile Communications * ******************************************************************************/ package org.webinos.android.impl; import java.util.HashMap; import java.util.Map; import org.webinos.api.DeviceAPIError; import org.webinos.api.sensor.ConfigureSensorOptions; import org.webinos.api.sensor.Sensor; import org.webinos.api.sensor.SensorCB; import org.webinos.api.sensor.SensorError; import org.webinos.api.sensor.SensorEvent; import android.hardware.SensorEventListener; public class SensorImpl extends Sensor { private SensorManagerImpl sensorManager; private android.hardware.Sensor sensor; public SensorImpl(SensorManagerImpl sensorManager, android.hardware.Sensor sensor) { super(); this.sensorManager = sensorManager; this.sensor = sensor; type = sensorTypes.get(sensor.getType()); displayName = sensor.getName(); description = sensor.getName(); maximumRange = (double)sensor.getMaximumRange(); minDelay = sensor.getMinDelay(); power = (double)sensor.getPower(); resolution = (double)sensor.getResolution(); vendor = sensor.getVendor(); version = sensor.getVersion(); rate = android.hardware.SensorManager.SENSOR_DELAY_NORMAL; eventFireMode = Sensor.EVENT_FIRE_MODE_FIXED; position = null; } static Map<Integer, String> sensorTypes = new HashMap<Integer, String>(); static { sensorTypes.put(android.hardware.Sensor.TYPE_LIGHT, WEBINOS_SENSOR_TYPE_LIGHT); sensorTypes.put(android.hardware.Sensor.TYPE_TEMPERATURE, WEBINOS_SENSOR_TYPE_TEMPERATURE); sensorTypes.put(android.hardware.Sensor.TYPE_PRESSURE, WEBINOS_SENSOR_TYPE_PRESSURE); sensorTypes.put(android.hardware.Sensor.TYPE_PROXIMITY, WEBINOS_SENSOR_TYPE_PROXIMITY); } private static final String TAG = SensorImpl.class.getName(); private SensorEventListener sensorListener; @Override public void configure(ConfigureSensorOptions cfgOptions) { eventFireMode = cfgOptions.eventFireMode; if (eventFireMode.equals(EVENT_FIRE_MODE_FIXED)) { rate = cfgOptions.rate; } else { rate = android.hardware.SensorManager.SENSOR_DELAY_NORMAL; } position = cfgOptions.position; } @Override public synchronized void start(final SensorCB cb) { if (cb == null) { return; } if (sensorListener == null) { sensorListener = new SensorEventListener() { @Override public void onAccuracyChanged(android.hardware.Sensor sensor, int accuracy) { } @Override public void onSensorChanged(android.hardware.SensorEvent event) { cb.onSensorEvent(getSensorEvent(event)); } }; sensorManager.getAndroidSensorManager().registerListener(sensorListener, sensor, rate); } } SensorEvent getSensorEvent(android.hardware.SensorEvent androidEvent) { SensorEvent event = new SensorEvent(); event.sensorType = type; event.position = position; event.eventFireMode = eventFireMode; event.rate = rate; event.accuracy = androidEvent.accuracy; if (event.sensorType.equals(WEBINOS_SENSOR_TYPE_LIGHT)) { event.values = new double[1]; event.values[0] = androidEvent.values[0]; } else if (event.sensorType.equals(WEBINOS_SENSOR_TYPE_TEMPERATURE)) { event.values = new double[1]; event.values[0] = androidEvent.values[0]; } else if (event.sensorType.equals(WEBINOS_SENSOR_TYPE_PRESSURE)) { event.values = new double[1]; event.values[0] = androidEvent.values[0]; } else if (event.sensorType.equals(WEBINOS_SENSOR_TYPE_PROXIMITY)) { event.values = new double[1]; event.values[0] = androidEvent.values[0]; } return event; } @Override public synchronized void stop() { if (sensorListener != null) { sensorManager.getAndroidSensorManager() .unregisterListener(sensorListener); } } }